import { BaseImporter } from './baseImporter';
import { Importer } from './importer';

import { ImportResult } from '../models/domain/importResult';

export class PasswordDragonXmlImporter extends BaseImporter implements Importer {
    parse(data: string): ImportResult {
        const result = new ImportResult();
        const doc = this.parseXml(data);
        if (doc == null) {
            result.success = false;
            return result;
        }

        const records = doc.querySelectorAll('PasswordManager > record');
        Array.from(records).forEach((record) => {
            const category = this.querySelectorDirectChild(record, 'Category');
            const categoryText = category != null && !this.isNullOrWhitespace(category.textContent) &&
                category.textContent !== 'Unfiled' ? category.textContent : null;
            this.processFolder(result, categoryText);

            const accountName = this.querySelectorDirectChild(record, 'Account-Name');
            const userId = this.querySelectorDirectChild(record, 'User-Id');
            const password = this.querySelectorDirectChild(record, 'Password');
            const url = this.querySelectorDirectChild(record, 'URL');
            const notes = this.querySelectorDirectChild(record, 'Notes');
            const cipher = this.initLoginCipher();
            cipher.name = accountName != null ? this.getValueOrDefault(accountName.textContent, '--') : '--';
            cipher.notes = notes != null ? this.getValueOrDefault(notes.textContent) : '';
            cipher.login.username = userId != null ? this.getValueOrDefault(userId.textContent) : null;
            cipher.login.password = password != null ? this.getValueOrDefault(password.textContent) : null;
            cipher.login.uris = url != null ? this.makeUriArray(url.textContent) : null;

            const attributes: string[] = [];
            for (let i = 1; i <= 10; i++) {
                attributes.push('Attribute-' + i);
            }

            this.querySelectorAllDirectChild(record, attributes.join(',')).forEach((attr) => {
                if (this.isNullOrWhitespace(attr.textContent) || attr.textContent === 'null') {
                    return;
                }
                this.processKvp(cipher, attr.tagName, attr.textContent);
            });

            this.cleanupCipher(cipher);
            result.ciphers.push(cipher);
        });

        if (this.organization) {
            this.moveFoldersToCollections(result);
        }

        result.success = true;
        return result;
    }
}
